/** 将URL解析成指定格式的JSON对象 */
function URLParser(url) {
    let urlObj = null;
    /** 浏览器环境的 <a> 可以直接解析 url */
    if(typeof document!== 'undefined') {
        urlObj = document.createElement('a');
        urlObj.href = url;
        urlObj.query = {};
        urlObj.search
        .slice(1, urlObj.search.length)
        .split('&').map(item => {
            let arr = item.split('=');
            urlObj.query[arr[0]] = arr[1];
        }
    )
        return {
            origin: urlObj.protocol + '//' + urlObj.hostname,
            protocol: urlObj.protocol,
            host: urlObj.hostname,
            port: urlObj.port,
            pathname: urlObj.pathname,
            hash: urlObj.hash,
            query: urlObj.search
        }
    } else {
        /** 在node中使用URL 对象解析 */
        urlObj = new URL(url);
        return {
            origin: urlObj.protocol + '//' + urlObj.hostname,
            protocol: urlObj.protocol,
            host: urlObj.hostname,
            port: urlObj.port,
            pathname: urlObj.pathname,
            hash: urlObj.hash,
            query: urlObj.searchParams,  
        }
    }
}
const url = 'http://sample.com/?a=1&e&b=2&c=xx&d#hash';

console.log(URLParser(url))

/**
 * --- 题目描述 ---
 * 
 * 实现一个函数，可以对 url 中的 query 部分做拆解，返回一个 key: value 形式的 object  
 * 
 * --- 实例 ---
 * 
 * 输入：'http://sample.com/?a=1&e&b=2&c=xx&d#hash' 
 * 输出：{a: 1, b: 2, c: 'xx', d: ''}  
 */

function getQueryObj(url) {
    let queryObj = {};
    urlObj = new URL(url);
    urlObj.search.slice(1, urlObj.search.length)
    .split('&').forEach(item => {
        let arr = item.split('=');
        queryObj[arr[0]] = arr[1] || '';
    })
    return queryObj;
}

console.log(getQueryObj(url));

/**
 * --- 题目描述 ---
 *
 * 实现一个 parseParam 函数，将 url 转化为指定结果
 *
 * --- 测试用例 ---
 *
 * 输入：url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled'
 * 输出：
{
 user:'anonymous',
 id:[123,456],// 重复出现的 key 要组装成数组，能被转成数字的就转成数字类型
 city:'北京',// 中文需解码
 enabled: true // 未指定值的 key 与约定为 true
}
*/

const parseParam = (url) => {
    const queryObj = {};
    const arr = url.split('?')[1].split('&');
    arr.forEach(e => {
        const [key, value] = e.split('=');
        if(key in queryObj) {
            /** array.push 和 array.concat 的区别
             * push:向原数组末尾添加元素；修改了原数组；返回新数组长度；
             * concat:连接两个数组，生成新数组；没有修改原数组；返回新数组；
             */
            Array.isArray(queryObj[key]) ? queryObj[key].push(value) : queryObj[key] = [queryObj[key]].concat(value);
        }else {
            queryObj[key] = value ? decodeURI(value) : true; 
        }
    })
    return queryObj;
}

console.log(parseParam('http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled'));
